﻿Shader "UnityShadersBook/Chapter07/Chapter07-SingleTexture"
{
    Properties
    {
        _Color( "Color Tint",Color) = (1,1,1,1 )
        _MainTex( "Main Tex", 2D ) =  "white"{}
        _Specular( "Specular", Color ) = ( 1,1,1,1 )
        _Gloss( "Gloss", Range( 8.0, 256 ) ) = 20
    }
    SubShader
    {
        // No culling or depth
        // Blend SrcAlpha OneMinusSrcAlpha
        Pass
        {
            Tags { "LightMode" = "ForwardBase" }

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "Lighting.cginc"

            fixed4 _Color;
            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed4 _Specular;
            float _Gloss;

            struct appdata
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f
            {
                float4 pos : SV_POSITION;
                float3 worldNormal : TEXCOORD0;
                float3 worldPos : TEXCOORD1;
                float2 uv : TEXCOORD2;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.worldNormal = UnityObjectToWorldNormal( v.normal );
                o.worldPos =  mul( unity_ObjectToWorld, v.vertex ).xyz;
                o.uv = TRANSFORM_TEX( v.texcoord, _MainTex );
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed3 worldNormal = normalize( i.worldNormal );
                fixed3 worldLight = normalize( UnityWorldSpaceLightDir( i.worldPos ) );

                fixed3 albedo = tex2D( _MainTex, i.uv ).rgb * _Color.rgb;

                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;

                fixed3 diffuse = _LightColor0.rgb * albedo * saturate( dot( i.worldNormal, worldLight ));
                fixed3 viewDir =  normalize( UnityWorldSpaceViewDir( i.worldPos ) );  //normalize(  _WorldSpaceCameraPos.xyz - i.worldPos );
                fixed3 halfDir = normalize( worldLight + viewDir );                
                fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate( dot( i.worldNormal,halfDir ) ),_Gloss);


                fixed3 color = ambient + diffuse + specular;
                return fixed4( color, 1.0);
            }
            ENDCG
        }
    }
}
